package com.example.springboot.Service;

import com.example.springboot.entity.Course;
import com.example.springboot.entity.Course_sort;
import com.example.springboot.entity.Room;
import com.example.springboot.mapper.CourseMapper;
import com.example.springboot.mapper.Course_sortMapper;
import com.example.springboot.mapper.RoomMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class Course_sortService {
    // 排课
    @Autowired
    private CourseMapper courseMapper;
    @Autowired
    private RoomMapper roomMapper;
    @Autowired
    private Course_sortMapper course_sortMapper;
    public void sortCourse(){
        //    先得到课程信息
        List<Course> courses = courseMapper.findAll();
        //     得到教室信息
        List<Room> rooms  = roomMapper.findAll();
//        排课假设教室都是空的
//        遍历每一个课程 分配时段和教室
//              对于教室来说  冲突的是不同的课程在同一时间段

        // 一周上课的次数
//            roomid+time  在的course_sorts中不能出现相同（时间地点冲突）
//            teacherid+time在的course_sorts中不能出现相同（教师上课时间冲突）
//        time 一个教室三十五节课

        for (Course item : courses) {
            Integer frequency = Frequency(24);
//            检查是否已经排课
//          ssssssssssss{}
            Course_sort course_sort = new Course_sort();
            //固定的
            course_sort.setCourse_id(item.getCourse_id());
            course_sort.setTeacher_id(item.getJob_id());  //  代课老师
            course_sort.setCourse_work(item.getCourse_stuTime()); //  返回上课周次
//            需要筛选的
            //  教室   教室是否有空位
//            排课次数
//            不要递归
                for (Room room : rooms) {
                    if (frequency==0) {
                        System.out.println("完成"+item.getCourse_id().toString()+"进行排课");
                        break;
                    }
                // 得到的教室号
//                教室是否有空闲时间段
                    if (funTime(room.getRoom_id())){
                        for (int i= 1; i <= 35; i++) {
                        // 在遍历时间段该教室是否空闲
                            if (roomTime(room.getRoom_id(),i)){   // 教室
//                            教师该时间段是否空闲
                                if (teacherTime(item.getJob_id(),i)){
//                                周次是否交叉
                                    if (work()){
                                        //这里写入第一条数据
                                        course_sort.setRoom_id(room.getRoom_id());
                                        course_sort.setCourse_time(i);
                                        try{
                                            course_sortMapper.insert(course_sort);
                                            frequency =frequency-1; // 写入次数的条件
                                            break;
                                        }catch (Exception e){
                                            System.out.println(e);
                                            System.out.println("写入失败");
                                            System.out.println(course_sort.getCourse_id());
                                            System.out.println(course_sort.getCourse_time());
                                            System.out.println(course_sort.getCourse_work());
                                            System.out.println(course_sort.getRoom_id());
                                            System.out.println(course_sort.getTeacher_id());
                                            return;
                                        }
//                                    到此完成排课  一节
//                                    如果还需要在排一次

                                    }else continue;

                                }else continue;

                            }else continue;
                        }
                    }else continue;

//

//                到这里-----------第二次排课
            }
            // 时间段遍历结束不可行就下一个教室
            // 可行则判断该时间段老师是否空闲
//     再检查

        }
    }
    public Integer Frequency(Integer period_time ){  //  返回课时每周的上课次数 （ 24 返回 2    ）
        return 2;
    }

//  周次是否交叉
    public boolean work(){
        return true;
    }
    //  教室是否有空闲时间段
    public boolean funTime(Integer roomID){
//        用教室号查询排课表 是否满课  一个教室可以排35 次课  直接统计是否有room_id cont == 35

        return  course_sortMapper.roomContNum(roomID)<35;
    }
    // 在遍历时间段该教室是否空闲
    public boolean roomTime(Integer roomID,int i){
        return course_sortMapper.roomT(roomID,i)<1;
    }
    // 教师该时间段是否空闲
    public boolean teacherTime(Integer teacher_id,int i){
        return course_sortMapper.teacherT(teacher_id,i)<1;
    }

}
